package n11_线程状态转换_重新理解;

import lombok.extern.slf4j.Slf4j;

import static utils.Sleeper.sleep;

/**
 * @author fu
 * @date 2021-12-26 14:57
 * 概要：
 * XXXXX
 */
@Slf4j(topic = "c.T1")
public class T1_test_wait_notify {
    final static Object obj = new Object();

    /**
     * 1. 先让 两个线程全部 wait
     * 2. notifyAll 将只有一个线程竞争锁成功
     * <p>
     * 注意：【断点】 是 Thread模式，一个线程运行 其他线程不会受到断点干扰
     */
    public static void main(String[] args) {

        new Thread(() -> {
            synchronized (obj) {
                log.debug("执行....");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("其它代码...."); // 断点
            }
        }, "t1").start();
        new Thread(() -> {
            synchronized (obj) {
                log.debug("执行....");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("其它代码...."); // 断点
            }
        }, "t2").start();

        sleep(0.5);
        log.debug("唤醒 obj 上其它线程");
        synchronized (obj) {

            obj.notifyAll(); // 唤醒obj上所有等待线程 断点
        }
    }
}